<!DOCTYPE html>
<html lang="en-us">
<head><head>
    <meta name="referrer" content="no-referrer"/>
    <meta name="google-site-verification" content="9vIieCe-Qpd78QOmBl63rGtIVbhY6sYyuxX3j8XWBA4" />
    <meta name="baidu-site-verification" content="LRrmH41lz7" />
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="google-site-verification" content="xBT4GhYoi5qRD5tr338pgPM5OWHHIDR6mNg1a3euekI" />
    <meta name="viewport" content="width=device-width, initial-scale=1">
    
    <meta name="description" content="用于扩展代理服务器的新接口允许将Istio可扩展性从控制平面移至Sidecar代理本身">
    
    <meta name="keyword"  content="暴走的初号机, shinji3887, 暴走的初号机的网络日志, 暴走的初号机的博客, shinji3887 Blog, 博客, 个人网站, 互联网, Web, 云原生, PaaS, Istio, Kubernetes, 微服务, Microservice">
    <link rel="shortcut icon" href="/img/favicon.ico">

    <title>重新定义代理的扩展性：WebAssembly在Envoy与Istio中的应用-同步率400%</title>

    <link rel="canonical" href="/post/redefining-extensibility-in-proxies/">

    <link rel="stylesheet" href="https://lupeier.cn-sh2.ufileos.com/iDisqus.min.css"/>
	
    
    <link rel="stylesheet" href="https://lupeier.cn-sh2.ufileos.com/bootstrap.min.css">

    
    <link rel="stylesheet" href="https://lupeier.cn-sh2.ufileos.com/hux-blog.min.css">

    
    <link rel="stylesheet" href="https://lupeier.cn-sh2.ufileos.com/syntax.css">

    
    <link rel="stylesheet" href="https://lupeier.cn-sh2.ufileos.com/zanshang.css">

    
    <link href="/css/font-awesome.min.css" rel="stylesheet" type="text/css">
    
    
    <script src="https://lupeier.cn-sh2.ufileos.com/jquery.min.js"></script>
    
    
    <script src="https://lupeier.cn-sh2.ufileos.com/bootstrap.min.js"></script>
    
    
    <script src="https://lupeier.cn-sh2.ufileos.com/hux-blog.min.js"></script>
</head>
</head>

<nav class="navbar navbar-default navbar-custom navbar-fixed-top">
    <div class="container-fluid">
        
        <div class="navbar-header page-scroll">
            <button type="button" class="navbar-toggle">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="/">L&#39;s Blog</a>
        </div>

        
        
        <div id="huxblog_navbar">
            <div class="navbar-collapse">
                <ul class="nav navbar-nav navbar-right">
                    <li>
                        <a href="/">Home</a>
                    </li>
                    
                    <li>
                        <a href="categories/tech">tech</a>
                    </li>
                    
                    <li>
                        <a href="categories/tips">tips</a>
                    </li>
                    
                    <li>
                        <a href="/about">About</a>
                    </li>
                    
                </ul>
            </div>
        </div>
        
    </div>
    
</nav>
<script>
    
    
    
    var $body   = document.body;
    var $toggle = document.querySelector('.navbar-toggle');
    var $navbar = document.querySelector('#huxblog_navbar');
    var $collapse = document.querySelector('.navbar-collapse');

    $toggle.addEventListener('click', handleMagic)
    function handleMagic(e){
        if ($navbar.className.indexOf('in') > 0) {
        
            $navbar.className = " ";
            
            setTimeout(function(){
                
                if($navbar.className.indexOf('in') < 0) {
                    $collapse.style.height = "0px"
                }
            },400)
        }else{
        
            $collapse.style.height = "auto"
            $navbar.className += " in";
        }
    }
</script>




<style type="text/css">
    header.intro-header{
        background-image: url('https://lupeier.cn-sh2.ufileos.com/person-standing-and-holding-lamp-inside-cave-2397414.jpg')
    }
</style>
<header class="intro-header" >
    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <div class="post-heading">
                    <div class="tags">
                       
                       <a class="tag" href="/tags/kubernetes" title="Kubernetes">
                           Kubernetes
                        </a>
                        
                       <a class="tag" href="/tags/istio" title="Istio">
                           Istio
                        </a>
                        
                       <a class="tag" href="/tags/servicemesh" title="ServiceMesh">
                           ServiceMesh
                        </a>
                        
                    </div>
                    <h1>重新定义代理的扩展性：WebAssembly在Envoy与Istio中的应用</h1>
                    <h2 class="subheading"></h2>
                    <span  class="meta">Posted by Istio.io on Saturday, March 7, 2020
                        
                    </span>
					<br>
                </div>
            </div>
        </div>
    </div>
</header>




<article>
    <div class="container">
        <div class="row">

            
            <div class="
                col-lg-8 col-lg-offset-2
                col-md-10 col-md-offset-1
                post-container">

        		
                        <header>
                        <h2>TOC</h2>
                        </header>
                        <nav id="TableOfContents">
  <ul>
    <li>
      <ul>
        <li><a href="#背景">背景</a></li>
        <li><a href="#什么是webassembly">什么是WebAssembly？</a></li>
        <li><a href="#为envoy带来webassembly">为Envoy带来WebAssembly</a></li>
        <li><a href="#在istio中构建webassembly">在Istio中构建WebAssembly</a></li>
        <li><a href="#开发者体验">开发者体验</a></li>
        <li><a href="#下一步">下一步</a></li>
      </ul>
    </li>
  </ul>
</nav>
        		
        		<blockquote>
<p>译者注：Istio的架构在1.5版本中发生了翻天覆地的变化，控制平面从微服务回归单体，pilot、citadel、galley等控制平面组件整合成了单一的istiod二进制文件，同时饱受诟病的mixer同志终于在1.5中deprecated了，社区呼声很高的Wasm以Proxy-Wasm plugins的方式登上历史舞台，官方承诺在1.6版本中提供标准的wasm插件配置API，甚至还推出了webassemblyhub这样的类似应用商店的服务，构建wasm plugin生态的野心不可谓不大。结合代理无关的ABI标准，只能说谷歌又在下一盘大棋。mixer的两大核心功能，check和report，分别使用Proxy-Wasm plugins和telemetry V2替代，曾经所谓的Mixer V2计划也渐渐烟消云散，湮没在历史尘埃中。本文翻译官方的技术博客，来一探本次的划时代变更proxy-wasm plugin的究竟。</p>
</blockquote>
<p>自2016年采用<a href="https://www.envoyproxy.io/">Envoy</a>以来，Istio项目一直希望提供一个平台，在此平台上可以构建丰富的扩展，以满足用户的多样化需求。 有很多理由可以向服务网格的数据平面添加功能-支持更新的协议，与专有安全控件集成或通过自定义指标增强可观察性等。</p>
<p>在过去的一年半中，我们在Google的团队一直在努力使用<a href="https://webassembly.org/">WebAssembly</a>向Envoy代理添加动态可扩展性。 我们很高兴今天与大家分享这项工作，并推出<a href="https://github.com/proxy-wasm/spec">WebAssembly (Wasm) for Proxies</a> (Proxy-Wasm)：我们打算标准化的ABI； SDK； 它的第一个主要实现是新型的，低延迟的<a href="https://istio.io/docs/reference/config/telemetry">Istio遥测系统</a>。</p>
<p>我们还与社区紧密合作，以确保为用户提供良好的开发人员体验，以帮助他们快速入门。 Google团队一直与<a href="https://solo.io/">Solo.io</a>团队紧密合作，他们已经构建了<a href="https://webassemblyhub.io/">WebAssembly Hub</a>，该服务用于构建，共享，发现和部署Wasm扩展。 使用WebAssembly Hub，Wasm扩展与容器一样易于管理，安装和运行。</p>
<p>这项工作今天发布了Alpha版本，还有很多工作要做，但是我们很高兴将其交到开发人员手中，以便他们可以开始尝试由此带来的巨大可能性。</p>
<h3 id="背景">背景</h3>
<p>Istio和Envoy项目的创建原则都是基于对可扩展性的需求，但是两个项目采用了不同的方法。 Istio项目的重点是启用具有轻量级开发人员体验的称为<a href="https://istio.io/docs/reference/config/policy-and-telemetry/mixer-overview/">Mixer</a>的通用进程外扩展模型，而Envoy则专注于代理内<a href="https://www.envoyproxy.io/docs/envoy/latest/extending/extending">扩展</a>。</p>
<p>每种方法都有其优点和缺点。 Istio模型导致严重的资源效率低下，从而影响了尾部延迟和资源利用率。 该模型在本质上也受到限制-例如，它永远不会为实现<a href="https://blog.envoyproxy.io/how-to-write-envoy-filters-like-a-ninja-part-1-d166e5abec09">自定义协议处理</a>提供支持。</p>
<p>Envoy模型强化了整体的构建过程，并要求使用C++编写扩展，从而限制了开发人员生态系统。 为集群发布新的扩展需要推入新的二进制文件并重新启动，这可能很难协调，并且会造成停机风险。 这也激励了开发人员向Envoy上游提交他们的扩展，而这些扩展仅由一小部分生产环境使用，只是为了肩负其发布机制。</p>
<p>随着时间的流逝，Istio的一些对性能最敏感的功能已进入Envoy的上游，例如<a href="https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/security/rbac_filter">流量策略检查</a>和<a href="https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/security/rbac_filter">遥测报告</a>。 尽管如此，我们一直希望将单个堆栈融合以实现可扩展性，从而减少折衷：这使Envoy版本与其扩展生态系统脱钩，使开发人员能够使用他们选择的语言进行工作，并使Istio可靠地推出新功能而不会造成停机风险。</p>
<h3 id="什么是webassembly">什么是WebAssembly？</h3>
<p><a href="https://webassembly.org/">WebAssembly</a>（Wasm）是一种可移植的字节码格式，用于以接近本机的速度执行以<a href="https://github.com/appcypher/awesome-wasm-langs">多种语言</a>编写的代码。 其最初的<a href="https://webassembly.org/docs/high-level-goals/">设计目标</a>与上述挑战很好地吻合，并且在其背后得到了可观的行业支持。 Wasm是在所有主要浏览器中本地运行的第四种标准语言（继HTML，CSS和JavaScript之后），于2019年12月成为<a href="https://www.w3.org/TR/wasm-core-1/">W3C Recommendation</a>。这使我们有信心对其进行战略下注。</p>
<p>尽管WebAssembly最初是作为客户端技术而诞生的，但在服务器上使用它具有许多优点。 运行时是内存安全的，并且经过沙盒处理以确保安全。 有一个大型工具生态系统可用于以文本或二进制格式编译和调试Wasm。 <a href="https://www.w3.org/">W3C</a>和<a href="https://bytecodealliance.org/">BytecodeAlliance</a>已成为其他服务器端工作的活跃中枢。 例如，Wasm社区正在W3C标准化<a href="https://hacks.mozilla.org/2019/03/standardizing-wasi-a-webassembly-system-interface/">“WebAssembly系统接口”（WASI）</a>，并提供一个示例实现，该示例为Wasm“程序”提供类似于OS的抽象。</p>
<h3 id="为envoy带来webassembly">为Envoy带来WebAssembly</h3>
<p><a href="https://github.com/envoyproxy/envoy/issues/4272">在过去的18个月中</a>，我们一直与Envoy社区合作，将Wasm可扩展性纳入Envoy并在上游做出贡献。 我们很高兴地宣布，此特性在<a href="https://istio.io/news/releases/1.5.x/announcing-1.5/">Istio 1.5</a>随附的Envoy版本中Alpha可用，其源代码包含在<a href="https://github.com/envoyproxy/envoy-wasm/">envoy-wasm</a>开发分支中，并且正在努力将其合并到Envoy主干中。 该实现使用内置在Google高性能<a href="https://v8.dev/">V8引擎</a>中的WebAssembly运行时。</p>
<p>除了底层的运行时，我们还构建了：</p>
<ul>
<li>
<p>用于在代理中嵌入Wasm的通用应用程序二进制接口（ABI），这意味着编译后的扩展将在不同版本的Envoy或其他代理（如果他们选择实施ABI）下也可以使用</p>
</li>
<li>
<p>用于在<a href="https://github.com/proxy-wasm/proxy-wasm-cpp-sdk">C++</a>，<a href="https://github.com/proxy-wasm/proxy-wasm-rust-sdk">Rust</a>和<a href="https://github.com/solo-io/proxy-runtime">AssemblyScript</a>中轻松进行扩展开发的SDK，还有更多后续更新</p>
</li>
<li>
<p>有关如何在Istio和独立的Envoy中进行部署的综合<a href="https://docs.solo.io/web-assembly-hub/latest/tutorial_code/">示例和说明</a></p>
</li>
<li>
<p>允许使用其他Wasm运行时的抽象，包括“空”运行时，该运行时将在本地把扩展编译进Envoy中，这对于测试和调试非常有用</p>
</li>
</ul>
<p>使用Wasm扩展Envoy可以为我们带来几个主要好处：</p>
<ul>
<li>
<p>敏捷性：可以使用Istio控制平面在运行时交付和重新加载扩展。 这样可以快速进行扩展的开发→测试→发布周期，而无需Envoy的重启。</p>
</li>
<li>
<p>标准发布：合并到主树中之后，Istio和其他人将能够使用Envoy的标准发布，而不是自定义版本。 这也将使Envoy社区有更多的时间将某些内置扩展迁移到该模型，从而减少其受支持的覆盖区域。</p>
</li>
<li>
<p>可靠性和隔离性：扩展部署在具有资源限制的沙箱中，这意味着它们现在可以崩溃或泄漏内存，而不会影响Envoy主进程。 CPU和内存使用率也可以受到限制。</p>
</li>
<li>
<p>安全性：沙盒具有用于与Envoy进行通信的明确定义的API，因此扩展只能访问并修改连接或请求中有限数量的属性。 此外，由于Envoy会协调此交互过程，因此可以隐藏或清除扩展中的敏感信息（例如，HTTP标头中的“Authorization”和“ Cookie”属性，或客户端的IP地址）。</p>
</li>
<li>
<p>灵活性：<a href="https://github.com/appcypher/awesome-wasm-langs">可以将30多种编程语言编译为WebAssembly</a>，从而使来自各种背景（C++，Go，Rust，Java，TypeScript等）的开发人员都可以使用他们选择的语言来编写Envoy扩展。</p>
</li>
</ul>
<p>“看到WASM在Envoy中的支持，我感到非常兴奋； 这是Envoy可扩展性的未来。 Envoy的WASM支持与社区驱动hub相结合，将在服务网格和API网关用例中释放出令人难以置信的网络领域创新。 我迫不及待地想看到社区的建设向前发展。” –Envoy创作者Matt Klein。</p>
<p>有关实现的技术细节，请关注即将在<a href="https://blog.envoyproxy.io/">Envoy博客</a>上发布的帖子。</p>
<p>主机环境和扩展之间的<a href="https://github.com/proxy-wasm">Proxy-Wasm</a>接口有意设计为与代理无关。 我们已将其内置到Envoy中，但旨在供其他代理供应商采用。 我们希望看到一个世界，您可以获取为Istio和Envoy编写的扩展，并在其他基础架构中运行它。 您很快就会听到更多有关此的信息。</p>
<h3 id="在istio中构建webassembly">在Istio中构建WebAssembly</h3>
<p>为了提高性能，Istio将其几个扩展移动到了1.5版本中内置的Envoy构建中。 在执行此工作时，我们一直在测试以确保这些相同的扩展可以作为Proxy-Wasm模块进行编译和运行，而行为没有任何变化。 鉴于我们认为Wasm目前的支持为Alpha，因此我们还没有准备好将此设置设为默认设置。 然而，这使我们对通用方法以及已开发的主机环境ABI和SDK充满了信心。</p>
<p>我们还非常小心地确保Istio控制平面及其<a href="https://istio.io/docs/reference/config/networking/envoy-filter/">Envoy配置API</a>可以支持Wasm。 我们有一些示例来说明如何执行几种常见的定制操作，例如定制标头解码或程序化路由，这是用户的常见要求。 当我们将支持转移到Beta时，您将看到说明在Istio中使用Wasm的最佳实践的文档。</p>
<p>最后，我们正在与许多编写了<a href="https://istio.io/docs/reference/config/policy-and-telemetry/adapters/">Mixer适配器</a>的供应商合作，以帮助他们迁移到Wasm —如果这是前进的最佳途径。 Mixer将在将来的版本中转为社区项目，在那里它将仍可用于遗留用例。</p>
<h3 id="开发者体验">开发者体验</h3>
<p>没有出色的开发人员体验，再强大的工具也毫无用处。 Solo.io<a href="https://www.solo.io/blog/an-extended-and-improved-webassembly-hub-to-helps-bring-the-power-of-webassembly-to-envoy-and-istio/">最近宣布</a>发布<a href="https://webassemblyhub.io/">WebAssembly Hub</a>，这是一套用于构建，部署，共享和发现Envoy和Istio的Envoy Proxy Wasm扩展的工具和存储库。</p>
<p>WebAssembly Hub完全自动化了开发和部署Wasm扩展所需的许多步骤。 使用WebAssembly Hub工具，用户可以轻松地以任何受支持的语言将其代码编译为Wasm扩展。 然后，可以将这些扩展上传到Hub注册表，并使用单个命令将其部署和取消部署到Istio。</p>
<p>在后台，Hub会处理很多细节问题，例如引入正确的工具链，ABI版本验证，权限控制等。 该工作流程还通过自动化扩展部署，消除了跨Istio服务代理的配置更改带来的麻烦。 该工具可帮助用户和运维人员避免由于配置错误或版本不匹配而引起的意外行为。</p>
<p>WebAssembly Hub工具提供了功能强大的CLI和优雅且易于使用的图形用户界面。 WebAssembly Hub的一个重要目标是简化构建Wasm模块的体验，并为开发人员提供共享和发现有用扩展的协作场所。</p>
<p>请查看<a href="https://docs.solo.io/web-assembly-hub/latest/tutorial_code/">入门指南</a>，以创建您的第一个Proxy-Wasm扩展。</p>
<h3 id="下一步">下一步</h3>
<p>除了努力发布Beta版，我们还致力于确保围绕Proxy-Wasm有一个持久的社区。 ABI需要最终确定，而将其转变为标准的工作将会在适当的标准机构内获得更广泛的反馈后完成。 向Envoy主干提供上游支持的工作仍在进行中。 我们还在为工具和WebAssembly Hub寻找合适的社区之家。</p>
<p>原文：<a href="https://istio.io/blog/2020/wasm-announce/">Redefining extensibility in proxies - introducing WebAssembly to Envoy and Istio</a></p>

        
                
        
              <hr>
              <ul class="pager">
                  
                  <li class="previous">
                      <a href="/post/cka-preparation-experience/" data-toggle="tooltip" data-placement="top" title="CKA考试经验总结">&larr; Previous Post</a>
                  </li>
                  
                  
                  <li class="next">
                      <a href="/post/webassembly-in-envoy/" data-toggle="tooltip" data-placement="top" title="WebAssembly in Envoy">Next Post &rarr;</a>
                  </li>
                  
              </ul>
  
              

<div id="gitalk-container"></div>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.css">
<script src="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.js"></script>
<script src="/js/md5.min.js"></script>
<script>
	const gitalk = new Gitalk({
	  clientID: 'aff2580d8cc58af83367',
	  clientSecret: '747547f5f87fcc5145b847ab76a498d7e501319f',
	  repo: 'comment',
	  owner: 'shinji3887',
	  admin: ['shinji3887'],
	  id: md5(location.pathname),      
	  distractionFreeMode: false  
	})

	gitalk.render('gitalk-container')
</script>


            </div>
            
            <div class="
                col-lg-8 col-lg-offset-2
                col-md-10 col-md-offset-1
                sidebar-container">

                
                <section>
                    <hr class="hidden-sm hidden-xs">
                    <h5><a href="/tags/">FEATURED TAGS</a></h5>
                    <div class="tags">
                     
                    
                        
                            <a href="/tags/api-gateway" title="api-gateway">
                                api-gateway
                            </a>
                        
                    
                        
                    
                        
                            <a href="/tags/cloud-native" title="cloud-native">
                                cloud-native
                            </a>
                        
                    
                        
                            <a href="/tags/devops" title="devops">
                                devops
                            </a>
                        
                    
                        
                            <a href="/tags/docker" title="docker">
                                docker
                            </a>
                        
                    
                        
                    
                        
                    
                        
                    
                        
                    
                        
                            <a href="/tags/istio" title="istio">
                                istio
                            </a>
                        
                    
                        
                    
                        
                            <a href="/tags/kubernetes" title="kubernetes">
                                kubernetes
                            </a>
                        
                    
                        
                            <a href="/tags/microservice" title="microservice">
                                microservice
                            </a>
                        
                    
                        
                    
                        
                    
                        
                    
                        
                    
                        
                            <a href="/tags/restful" title="restful">
                                restful
                            </a>
                        
                    
                        
                    
                        
                            <a href="/tags/servicemesh" title="servicemesh">
                                servicemesh
                            </a>
                        
                    
                        
                            <a href="/tags/spring-cloud" title="spring-cloud">
                                spring-cloud
                            </a>
                        
                    
                        
                            <a href="/tags/vue" title="vue">
                                vue
                            </a>
                        
                    
                        
                    
                        
                    
                    </div>
                </section>

                
                <hr>
                <h5>FRIENDS</h5>
                <ul class="list-inline">
                    
                        <li><a target="_blank" href="https://skyao.io/">小剑的博客</a></li>
                    
                        <li><a target="_blank" href="https://zhaohuabing.com/">huabing的博客</a></li>
                    
                        <li><a target="_blank" href="http://blog.didispace.com/">程序猿DD的博客</a></li>
                    
                </ul>
            </div>
        </div>
    </div>
</article>




<footer>
    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <ul class="list-inline text-center">
                   
                   <li>
                       <a href="" rel="alternate" type="application/rss+xml" title="L&#39;s Blog" >
                           <span class="fa-stack fa-lg">
                               <i class="fa fa-circle fa-stack-2x"></i>
                               <i class="fa fa-rss fa-stack-1x fa-inverse"></i>
                           </span>
                       </a>
                   </li>
                   
                    
                    <li>
                        <a href="mailto:18016380795@163.com">
                            <span class="fa-stack fa-lg">
                                <i class="fa fa-circle fa-stack-2x"></i>
                                <i class="fa fa-envelope fa-stack-1x fa-inverse"></i>
                            </span>
                        </a>
                    </li>
		    
                    
                    
                    
                    

                    

		    
                    
                    <li>
                        <a target="_blank" href="/link%20of%20wechat%20QR%20code%20image">
                            <span class="fa-stack fa-lg">
                                <i class="fa fa-circle fa-stack-2x"></i>
                                <i class="fa fa-wechat fa-stack-1x fa-inverse"></i>
                            </span>
                        </a>
                    </li>
		    
                    
                    <li>
                        <a target="_blank" href="https://github.com/shinji3887">
                            <span class="fa-stack fa-lg">
                                <i class="fa fa-circle fa-stack-2x"></i>
                                <i class="fa fa-github fa-stack-1x fa-inverse"></i>
                            </span>
                        </a>
                    </li>
		    
                    
                    <li>
                        <a target="_blank" href="https://www.linkedin.com/in/lupeier">
                            <span class="fa-stack fa-lg">
                                <i class="fa fa-circle fa-stack-2x"></i>
                                <i class="fa fa-linkedin fa-stack-1x fa-inverse"></i>
                            </span>
                        </a>
                    </li>
		    
                </ul>
		<p class="copyright text-muted">
                    Copyright &copy; L&#39;s Blog , 2020
                    <br>
                    <br>
                    <a href="http://icp.chinaz.com/info?q=lupeier.com" target="_blank">备案号：沪ICP备19022667号-1</a>                    
                </p>
            </div>
        </div>
    </div>
</footer>



<script>
    function async(u, c) {
      var d = document, t = 'script',
          o = d.createElement(t),
          s = d.getElementsByTagName(t)[0];
      o.src = u;
      if (c) { o.addEventListener('load', function (e) { c(null, e); }, false); }
      s.parentNode.insertBefore(o, s);
    }
</script>






<script>
    
    if($('#tag_cloud').length !== 0){
        async("/js/jquery.tagcloud.js",function(){
            $.fn.tagcloud.defaults = {
                
                color: {start: '#bbbbee', end: '#0085a1'},
            };
            $('#tag_cloud a').tagcloud();
        })
    }
</script>


<script>
    async("/js/fastclick.js", function(){
        var $nav = document.querySelector("nav");
        if($nav) FastClick.attach($nav);
    })
</script>


<script>
    (function(){
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https'){
       bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
      }
      else{
      bp.src = 'http://push.zhanzhang.baidu.com/push.js';
      }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
</script>







</body>
</html>
